#pragma once

#include <sw/redis++/redis.h>
#include <iostream>
#include <string>
#include <memory>

namespace bite_im 
{
    class RedisClientFactory
    {
    public:
        static std::shared_ptr<sw::redis::Redis> create(const std::string &host, int port, int db, bool keep_alive) {
            sw::redis::ConnectionOptions opts;
            opts.host = host;
            opts.port = port;
            opts.db = db;
            opts.keep_alive = keep_alive;
            auto res = std::make_shared<sw::redis::Redis>(opts);
            return res;
        }
    };

    // 会话信息
    class Session 
    {
    public:
        using ptr = std::shared_ptr<Session>;
        Session(const std::shared_ptr<sw::redis::Redis> &redis_client) : _redis_client(redis_client) {}

        // 添加键值对
        void append(const std::string &ssid, const std::string &uid) {
            _redis_client->set(ssid, uid);
        }
        // 删除会话
        void remove(const std::string &ssid) {
            _redis_client->del(ssid);
        }
        // 获取用户id
        sw::redis::OptionalString uid(const std::string &ssid) {
            return _redis_client->get(ssid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };

    // 登陆状态 新增 删除 判断是否存在（重复登录）
    class Status 
    {
    public:
        using ptr = std::shared_ptr<Status>;
        Status(const std::shared_ptr<sw::redis::Redis> &redis_client) : _redis_client(redis_client) {}

        // 添加用户id
        void append(const std::string &uid) {
            _redis_client->set(uid, "");    // 能判断是否登录就行了
        }
        // 删除用户id
        void remove(const std::string &uid) {
            _redis_client->del(uid);
        }
        // 获取用户id （是否登录）
        bool exists(const std::string &uid) {
            return _redis_client->get(uid) ? true : false;
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };

    // 验证码管理
    class Codes 
    {
    public:
        using ptr = std::shared_ptr<Codes>;
        Codes(const std::shared_ptr<sw::redis::Redis> &redis_client) : _redis_client(redis_client) {}

        // 添加验证码id 和 验证码键值对
        void append(const std::string &cid, const std::string &code, const std::chrono::milliseconds &t = std::chrono::milliseconds(300000)) {
            _redis_client->set(cid, code, t);
        }
        // 删除验证码
        void remove(const std::string &cid) {
            _redis_client->del(cid);
        }
        // 获取验证码
        sw::redis::OptionalString code(const std::string &cid) {
            return _redis_client->get(cid);
        }
    private:
        std::shared_ptr<sw::redis::Redis> _redis_client;
    };
}